package com.atwj.store.service.impl;

import com.atwj.store.Vo.CartVo;
import com.atwj.store.entity.Address;
import com.atwj.store.entity.Cart;
import com.atwj.store.entity.Product;
import com.atwj.store.mapper.CartMapper;
import com.atwj.store.service.CartService;
import com.atwj.store.service.IProductService;
import com.atwj.store.service.ex.AccessDeniedException;
import com.atwj.store.service.ex.CartNotExistException;
import com.atwj.store.service.ex.InsertException;
import com.atwj.store.service.ex.UpdateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * @author 吴先森
 * @description:
 * @create 2022-05-21 20:21
 */
@Service
public class CartServiceImpl implements CartService {
    @Autowired
    private CartMapper cartMapper;
    @Autowired
    private IProductService productService; //辅助购物车得到商品的详细信息


    @Override
    public void addToCart(Integer uid, Integer pid, Integer amount, String username) {
        // 根据参数pid和uid查询购物车中的数据
        Cart result = cartMapper.findByUidAndPid(uid, pid);
        Date now = new Date();
        // 判断查询结果是否为null
        // 是：表示该用户并未将该商品添加到购物车
        if (result == null) {
            // 是：表示该用户并未将该商品添加到购物车
            // 创建Cart对象
            Cart cart = new Cart();
            // 封装数据：uid,pid,amount
            cart.setUid(uid);
            cart.setPid(pid);
            cart.setNum(amount);
            // 调用productService.findById(pid)查询商品数据，得到商品价格
            Product product = productService.findById(pid);
            // 封装数据：price
            cart.setPrice(product.getPrice());
            // 封装数据：4个日志
            cart.setCreatedUser(username);
            cart.setCreatedTime(now);
            cart.setModifiedUser(username);
            cart.setModifiedTime(now);
            // 调用insert(cart)执行将数据插入到数据表中
            Integer rows = cartMapper.insert(cart);
            if (rows != 1) {
                throw new InsertException("插入商品数据时出现未知错误，请联系系统管理员");
            }
        } else {
            // 否：表示该用户的购物车中已有该商品
            // 从查询结果中获取购物车数据的id
            Integer cid = result.getCid();
            // 从查询结果中取出原数量，与参数amount相加，得到新的数量
            Integer num = result.getNum() + amount;
            // 执行更新数量
            Integer rows = cartMapper.updateCartNum(cid, num, username, now);
            if (rows != 1) {
                throw new InsertException("修改商品数量时出现未知错误，请联系系统管理员");
            }
        }
    }

    @Override
    public List<CartVo> findCartVoById(Integer uid) {
        return cartMapper.findVoById(uid);
    }

    @Override
    public Integer addCartNum(Integer cid, Integer uid, String username) {
        //根据cid查找购物车信息
        Cart resultCart = cartMapper.findCartById(cid);
        //判断购物车是否存在，如果不存在则报购物车没有存在异常
        if(resultCart == null){
            throw new CartNotExistException("为查询到购物车信息，请检查");
        }

        //判断操作用户id是否和购物车所属用户id是否相同，不同则报非法操作异常
        Integer resultUid = resultCart.getUid();
        if(resultUid != uid){
            throw new AccessDeniedException("TM，非法操作，劝你好之为之");
        }

        //实现商品数量加加操作
        Integer newCartNum = resultCart.getNum() + 1;
        Integer rows = cartMapper.updateCartNum(cid, newCartNum, username, new Date());

        if(rows != 1){
            throw new UpdateException("加购商品出错，请联系管理员");
        }

        //返回新的数量
        return newCartNum;
    }

    @Override
    public Integer delCartNum(Integer cid, Integer uid, String username) {
        //根据cid查找购物车信息
        Cart resultCart = cartMapper.findCartById(cid);
        //判断购物车是否存在，如果不存在则报购物车没有存在异常
        if(resultCart == null){
            throw new CartNotExistException("为查询到购物车信息，请检查");
        }

        //判断操作用户id是否和购物车所属用户id是否相同，不同则报非法操作异常
        Integer resultUid = resultCart.getUid();
        if(resultUid != uid){
            throw new AccessDeniedException("TM，非法操作，劝你好之为之");
        }

        //实现商品数量减一操作
        Integer newCartNum = resultCart.getNum() - 1;
        if(newCartNum <= 0){
            newCartNum = 0;
        }
        Integer rows = cartMapper.updateCartNum(cid, newCartNum, username, new Date());

        if(rows != 1){
            throw new UpdateException("加购商品出错，请联系管理员");
        }

        //返回新的数量
        return newCartNum;
    }

    @Override
    public void delCart(Integer cid, Integer uid) {
        Cart resultCart = cartMapper.findCartById(cid);
        if(resultCart == null){
            throw new CartNotExistException("咋回事，购物车商品信息都么的，你还想删除");
        }

        Integer resultUid = resultCart.getUid();
        if(resultUid != uid){
            throw new AccessDeniedException("TM，非法操作，劝你好之为之");
        }

        Integer rows = cartMapper.delCart(cid);
        if(rows != 1){
            throw new UpdateException("删除商品出错，请联系管理员");
        }
    }

    @Override
    public List<CartVo> findCartVoByCid(Integer[] cids, Integer uid) {
        List<CartVo> resultCartVos = cartMapper.findVoByCids(cids);
        Iterator<CartVo> it = resultCartVos.iterator();
        while (it.hasNext()) {
            CartVo cart = it.next();
            if (!cart.getUid().equals(uid)) {
                it.remove();
            }
        }
        return resultCartVos;
    }
}
